package datastructure.recursion;

/**
 * 递归
 *      1 递归方法内部调用递归方法(比如 test), 递归方法后面的代码是按照递归顺序反序执行的,
 *        最里面的递归先执行, 最外层的递归后执行
 *        递归的执行顺序 A 1 B -> A1A1A1A1 B B B B
 *        核心
 *          递归的本质是使用到了方法内部调用自身方法, 也就是方法栈, 利用了栈的遍历回溯性特征
 *          (递归的本质是方法栈)
 *      2 需要注意递归方法的返回值
 *      3 八皇后问题的核心
 *          在新的一行的第一列放入皇后之后检查是否冲突, 如果冲突, 皇后的位置向后移动, 如果新的一行的所有位置都冲突,
 *          会回溯到上一行的皇后的位置, 把上一行的皇后继续往后移动, 每次都判断是否冲突, 如果都冲突, 继续回溯到上上一行
 *          每一次冲突发生会在当前行继续遍历, 如果当前行的位置都冲突, 就会往之前的行去回溯, 改变之前行的皇后的位置
 *      4 递归的退出条件的写法
 *          一是在方法的开头部分对方法传入的参数进行条件判断然后 return
 *          二是在方法中部或者尾部通过条件判断是否进入递归方法
 *          本质上都是对方法传入的参数进行条件判断, 上述两者可以一起使用
 *
 *
 */
public class RecursionMain {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //通过打印问题，回顾递归调用机制
        test(10);

        //int res = factorial(3);
        //System.out.println("res=" + res);
    }

    //打印问题.
    public static void test(int n) {
        if (n > 2) {
            test(n - 1);
        } //else {
        System.out.println("n=" + n);
        // }
    }

    //阶乘问题
    public static int factorial(int n) {
        if (n == 1) {
            return 1;
        } else {
            return factorial(n - 1) * n; // 1 * 2 * 3
        }
    }

}
